package org.ym.tools;

import org.apache.commons.lang3.StringUtils;

import java.io.*;

/**
 * 对象序列化
 *
 * @author ym
 * @date 2023-01-31 16:17:52
 */
public class ObjectSerializeTool {
    private ObjectSerializeTool() {
    }

    /**
     * 序列化为二进制数组
     *
     * @param o 对象
     * @return byte[]
     */
    public static byte[] toByte(Object o) throws IOException {
        if (o != null) {
            try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
                objectOutputStream.writeObject(o);
                return byteArrayOutputStream.toByteArray();
            }
        }else{
            return new byte[0];
        }
    }

    /**
     * 序列化为16进制字符串数据
     *
     * @param o 对象
     * @return String
     * @throws IOException 错误
     */
    public static String toHexString(Object o) throws IOException {
        return HexTool.toHexString(toByte(o));
    }

    /**
     * 序列化为Base64字符串数据
     *
     * @param o 对象
     * @return String
     * @throws IOException 错误
     */
    public static String toBase64String(Object o) throws IOException {
        return Base64Tool.encode(toByte(o));
    }

    /**
     * 二进制数组反序化对象
     *
     * @param data   二进制数组
     * @param classZ 类型
     * @return 对象
     */
    public static <T> T fromByte(byte[] data, Class<T> classZ) throws IOException, ClassNotFoundException {
        if (data == null || data.length == 0) {
            return null;
        }
        try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data); ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {
            Object o = objectInputStream.readObject();
            if(o != null && o.getClass().equals(classZ)){
                return classZ.cast(o);
            }else{
                return null;
            }
        }
    }

    /**
     * hex字符串反序化对象
     *
     * @param hexData hex字符串
     * @param classZ  类型
     * @return 对象
     */
    public static <T> T fromHexString(String hexData, Class<T> classZ) throws IOException, ClassNotFoundException {
        if (StringUtils.isBlank(hexData)) {
            return null;
        }
        return fromByte(HexTool.fromHexString(hexData), classZ);
    }

    /**
     * base64字符串反序化对象
     *
     * @param base64Data base64字符串
     * @param classZ     类型
     * @return 对象
     */
    public static <T> T fromBase64String(String base64Data, Class<T> classZ) throws IOException, ClassNotFoundException {
        if (StringUtils.isBlank(base64Data)) {
            return null;
        }
        return fromByte(Base64Tool.decodeToByte(base64Data), classZ);
    }
}
